// Kokomi.js - Three.js 组件框架
import * as kokomi from "kokomi.js";
// postprocessing - 后期处理效果库
import * as POSTPROCESSING from "postprocessing";

import type Experience from "./Experience";

/**
 * 后期处理组件
 * 使用 postprocessing 库实现 Bloom 辉光效果
 * 增强场景的视觉表现力
 */
export default class Postprocessing extends kokomi.Component {
  declare base: Experience; // Experience 实例引用
  params; // 参数对象（当前未使用）
  bloom: POSTPROCESSING.BloomEffect; // Bloom 辉光效果
  
  constructor(base: Experience) {
    super(base);

    this.params = {};

    // 创建效果组合器（管理所有后期效果）
    const composer = new POSTPROCESSING.EffectComposer(this.base.renderer, {
      multisampling: 8, // 8x 多重采样抗锤齿
    });
    // 将 composer 挂载到 base 上（供外部访问）
    // @ts-ignore
    this.base.composer = composer;

    // 添加渲染通道（基础场景渲染）
    composer.addPass(
      new POSTPROCESSING.RenderPass(this.base.scene, this.base.camera)
    );

    // 创建 Bloom 辉光效果
    const bloom = new POSTPROCESSING.BloomEffect({
      blendFunction: POSTPROCESSING.BlendFunction.ADD, // 混合模式：加法
      mipmapBlur: true, // 启用 mipmap 模糊（更高效）
      luminanceThreshold: 0, // 亮度阈值（0=所有像素都参与）
      luminanceSmoothing: this.base.params.bloomLuminanceSmoothing, // 亮度平滑度
    });
    this.bloom = bloom;

    // 创建效果通道并添加 Bloom 效果
    const effectPass = new POSTPROCESSING.EffectPass(this.base.camera, bloom);
    composer.addPass(effectPass);
  }
  /**
   * 设置 Bloom 亮度平滑度
   * @param value - 平滑度值（越小辉光范围越小）
   */
  setLuminanceSmoothing(value: number) {
    this.bloom.luminanceMaterial.smoothing = value;
  }
  
  /**
   * 设置 Bloom 强度
   * @param value - 强度值（越大辉光越强）
   */
  setIntensity(value: number) {
    this.bloom.intensity = value;
  }
}
